/*
 * Copyright (C) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup AVPlayer
 * @{
 *
 * @brief 为媒体源提供播放能力的API。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @since 11
 * @version 1.0
 */

/**
 * @file avplayer.h
 *
 * @brief 定义avplayer接口。使用AVPlayer提供的Native API播放媒体源。
 * 
 * @sample [AVPlayerNDKVideo]
 * (https://gitee.com/openharmony/applications_app_samples/tree/master/code/DocsSample/Media/AVPlayer/AVPlayerNDK)
 * @kit MediaKit
 * @library libavplayer.so
 * @include <multimedia/player_framework/avplayer.h>
 * @since 11
 * @version 1.0
 */

#ifndef MULTIMEDIA_PLAYER_FRAMEWORK_NATIVE_AVPLAYER_H
#define MULTIMEDIA_PLAYER_FRAMEWORK_NATIVE_AVPLAYER_H

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "native_averrors.h"
#include "avplayer_base.h"
#include "native_window/external_window.h"
#include "ohaudio/native_audiostream_base.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief MediaKeySession类型。
 * @since 12
 * @version 1.0
 */
typedef struct MediaKeySession MediaKeySession;
/**
 * @brief DRM_MediaKeySystemInfo类型。
 * @since 12
 * @version 1.0
 */
typedef struct DRM_MediaKeySystemInfo DRM_MediaKeySystemInfo;

/**
 * @brief 播放器DRM信息更新时调用。
 * @param player 指向OH_AVPlayer实例的指针。
 * @param mediaKeySystemInfo DRM信息。
 * @return void
 * @since 12
 * @version 1.0
 */
typedef void (*Player_MediaKeySystemInfoCallback)(OH_AVPlayer *player, DRM_MediaKeySystemInfo* mediaKeySystemInfo);

/**
 * @brief 创建播放器。\n
 * 
 * 推荐单个应用创建的音视频播放器实例（即音频、视频、音视频三类相加）不超过16个。\n
 * 可创建的音视频播放器实例数量依赖于设备芯片的支持情况，如芯片支持创建的数量少于上述情况，请以芯片规格为准。
 * 如RK3568推荐单个应用创建6个以内的音视频播放器实例。
 * 
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @return 如果创建成功返回指向OH_AVPlayer实例的指针，否则返回空指针。\n
 * 可能的失败原因：\n
 * 1.PlayerFactory::CreatePlayer执行失败。\n
 * 2.new PlayerObject执行失败。
 * @since 11
 * @version 1.0
*/
OH_AVPlayer *OH_AVPlayer_Create(void);

/**
 * @brief 设置播放器的播放源。对应的源可以是http url。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param url 播放源。
 * @return AV_ERR_OK：设置成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，url为空或者player SetUrlSource执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetURLSource(OH_AVPlayer *player, const char *url);

/**
 * @brief 设置播放器的媒体文件描述符来源。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param fd 媒体源的文件描述符。
 * @param offset 媒体源在文件描述符中的偏移量。
 * @param  size 表示媒体源的大小。
 * @return AV_ERR_OK：fd设置成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player SetFdSource执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetFDSource(OH_AVPlayer *player, int32_t fd, int64_t offset, int64_t size);

/**
 * @brief 设置播放器的媒体源，该媒体源的数据由应用程序提供。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param datasrc 指向自定义媒体数据的指针。
 * @param userData 用户传入的句柄，用于回调中传入。userData若为空，不支持AVPlayer的多实例播放。
 * @return AV_ERR_OK：设置成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者输入datasrc为空指针。
 * @since 21
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetDataSource(OH_AVPlayer *player, OH_AVDataSourceExt* datasrc, void* userData);

/**
 * @brief 准备播放环境，异步缓存媒体数据。\n
 *
 * 此函数必须在SetSource之后调用。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player Prepare执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_Prepare(OH_AVPlayer *player);

/**
 * @brief 开始播放。\n
 *
 * 此函数必须在{@link OH_AVPlayer_Prepare}之后调用。\n
 * 如果播放器状态为\<Prepared>，调用此函数开始播放。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player Play执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_Play(OH_AVPlayer *player);

/**
 * @brief 暂停播放。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player Pause执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_Pause(OH_AVPlayer *player);

/**
 * @brief 停止播放。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player Stop执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_Stop(OH_AVPlayer *player);

/**
 * @brief 将播放器恢复到初始状态。\n
 *
 * 函数调用完成后，调用SetSource添加播放源。调用{@link OH_AVPlayer_Prepare}后，再调用{@link OH_AVPlayer_Play}重新开始播放。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player Reset执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_Reset(OH_AVPlayer *player);

/**
 * @brief 异步释放播放器资源。\n
 *
 * 异步释放可以提升性能，但不能确保播放画面的SurfaceBuffer已释放。调用者需要确保播放画面窗口的生命周期安全。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player Release执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_Release(OH_AVPlayer *player);

/**
 * @brief 同步释放播放器资源。\n
 *
 * 同步过程保证了播放画面的SurfaceBuffer释放，但该过程耗时较长，建议调用者自行设计异步机制。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player ReleaseSync执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_ReleaseSync(OH_AVPlayer *player);

/**
 * @brief 设置播放器的音量。\n
 *
 * 可以在播放或暂停的过程中使用。0表示无声音，1为原始值。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param leftVolume 要设置的左声道目标音量。
 * @param rightVolume 要设置的右声道目标音量。
 * @return AV_ERR_OK：成功设置音量。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player SetVolume执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetVolume(OH_AVPlayer *player, float leftVolume, float rightVolume);

/**
 * @brief 设置播放器的响度。
 *
 * 当播放处于prepared/playing/paused/completed/stopped状态时，可调用该接口。\n
 * 默认响度增益0.0dB。播放器流的usage参数必须是{@link OH_AudioStream_Usage}.AUDIOSTREAM_USAGE_MUSIC，\n
 * {@link OH_AudioStream_Usage}.AUDIOSTREAM_USAGE_MOVIE，{@link OH_AudioStream_Usage}.AUDIOSTREAM_USAGE_AUDIOBOOK 之一。\n
 * 音频渲染器的延迟模式必须是{@link OH_AudioStream_LatencyMode}.AUDIOSTREAM_LATENCY_MODE_NORMAL。\n
 * 如果通过高分辨率管道播放，则不支持此操作。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param loudnessGain 设置播放器的响度值，单位为dB，响度范围为[-90.0, 24.0]。
 * @return AV_ERR_OK：成功设置响度。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者输入的loudnessGain是无效参数。\n
 *         AV_ERR_INVALID_STATE：函数在不正常的状态下调用，或者audioRendererInfo的usage参数不是{@link StreamUsage}.STREAM_USAGE_MUSIC，\n
 *              {@link StreamUsage}.STREAM_USAGE_MOVIE ，{@link StreamUsage}.STREAM_USAGE_AUDIOBOOK 之一。\n
 *         AV_ERR_SERVICE_DIED：系统错误。
 * @since 21
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetLoudnessGain(OH_AVPlayer *player, float loudnessGain);

/**
 * @brief 改变播放位置。\n
 *
 * 此函数可以在播放或暂停时使用。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param mSeconds 播放目标位置，精确到毫秒。
 * @param mode 播放器的跳转模式。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player Seek执行失败。
 * @since 11
 * @version 1.0
*/
OH_AVErrCode OH_AVPlayer_Seek(OH_AVPlayer *player, int32_t mSeconds, AVPlayerSeekMode mode);

/**
 * @brief 获取播放位置，精确到毫秒。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param currentTime 播放位置。
 * @return AV_ERR_OK：成功获取当前播放位置。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player GetCurrentTime执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetCurrentTime(OH_AVPlayer *player, int32_t *currentTime);

/**
 * @brief 获取视频宽度。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param videoWidth 视频宽度。
 * @return AV_ERR_OK：成功获取视频宽度。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetVideoWidth(OH_AVPlayer *player, int32_t *videoWidth);

/**
 * @brief 获取视频高度。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param videoHeight 视频高度。
 * @return AV_ERR_OK：成功获取视频高度。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetVideoHeight(OH_AVPlayer *player, int32_t *videoHeight);

/**
 * @brief 根据指定的{@link AVPlaybackSpeed}，设置播放器的播放速率。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param speed 速率模式。
 * @return AV_ERR_OK：成功设置播放速率。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetPlaybackSpeed(OH_AVPlayer *player, AVPlaybackSpeed speed);


/**
 * @brief 在有效范围内，设置播放器的播放速率。\n
 * 支持的状态：已准备/正在播放/已暂停/已完成。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param rate 播放速率，有效范围是0.125~4。
 * @return AV_ERR_OK：成功设置播放速率。\n
 *         AV_ERR_OPERATE_NOT_PERMIT：如果在不支持的状态下调用或在直播期间调用。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者速率超出范围。
 * @since 20
 */
OH_AVErrCode OH_AVPlayer_SetPlaybackRate(OH_AVPlayer *player, float rate);

/**
 * @brief 获取当前播放器的播放速率。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param speed 速率模式。
 * @return AV_ERR_OK：成功获取播放速率。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player GetPlaybackSpeed执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetPlaybackSpeed(OH_AVPlayer *player, AVPlaybackSpeed *speed);

/**
 * @brief 设置player音频流类型。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param streamUsage player音频流设置的类型。
 * @return AV_ERR_OK：成功设置音频流类型。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针或者streamUsage值无效。
 * @since 12
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetAudioRendererInfo(OH_AVPlayer *player, OH_AudioStream_Usage streamUsage);

/**
 * @brief 设置player音频流音量模式。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param volumeMode 指定音频流音量模式。
 * @return AV_ERR_OK：成功设置音频流音量模式。\n
 *         AV_ERR_INVALID_VAL： 输入player为空指针或者volumeMode值无效。\n
 *         AV_ERR_INVALID_STATE：函数在无效状态下调用，应先处于准备状态。\n
 *         AV_ERR_SERVICE_DIED：系统错误。
 * @since 18
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetVolumeMode(OH_AVPlayer *player, OH_AudioStream_VolumeMode volumeMode);

/**
 * @brief 设置player音频流的打断模式。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param interruptMode player音频流使用的打断模式。
 * @return AV_ERR_OK：成功设置音频流的打断模式。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者interruptMode值无效。
 * @since 12
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetAudioInterruptMode(OH_AVPlayer *player, OH_AudioInterrupt_Mode interruptMode);

/**
 * @brief 设置player音频流的音效模式。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param effectMode player音频流使用的音效模式。
 * @return AV_ERR_OK：成功设置音频流的音效模式。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者effectMode值无效。
 * @since 12
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetAudioEffectMode(OH_AVPlayer *player, OH_AudioStream_AudioEffectMode effectMode);

/**
 * @brief 设置hls播放器使用的码率。仅对HLS协议网络流有效。\n
 * 
 * 默认情况下，播放器会根据网络连接情况选择合适的码率和速度。\n
 * 通过INFO_TYPE_BITRATE_COLLECT上报有效码率链表，
 * 设置并选择指定的码率，选择小于且最接近的码率。
 * 准备好后，读取以查询当前选择的比特率。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param bitRate 码率，单位为bps。
 * @return AV_ERR_OK：成功设置码率。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player SelectBitRate执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SelectBitRate(OH_AVPlayer *player, uint32_t bitRate);

/**
 * @brief 设置播放画面窗口。\n
 *
 * 此函数必须在SetSource之后，Prepare之前调用。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param window 指向OHNativeWindow实例的指针。
 * @return AV_ERR_OK：成功设置播放画面窗口。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，输入window为空指针或者player SetVideoSurface执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetVideoSurface(OH_AVPlayer *player, OHNativeWindow *window);

/**
 * @brief 获取媒体文件的总时长，精确到毫秒。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param duration 媒体文件的总时长。
 * @return AV_ERR_OK：成功获取媒体文件时长。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player GetDuration执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetDuration(OH_AVPlayer *player, int32_t *duration);

/**
 * @brief 获取当前播放状态。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param state 当前播放状态。
 * @return AV_ERR_OK：成功获取当前播放状态。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player GetState执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetState(OH_AVPlayer *player, AVPlayerState *state);

/**
 * @brief 判断播放器是否在播放。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return 如果正在播放，则返回true；如果不在播放或者输入player为空指针则返回false。
 * @since 11
 * @version 1.0
 */
bool OH_AVPlayer_IsPlaying(OH_AVPlayer *player);

/**
 * @brief 判断是否循环播放。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @return 如果是循环播放，则返回true；如果不是循环播放或者输入player为空指针则返回false。
 * @since 11
 * @version 1.0
 */
bool OH_AVPlayer_IsLooping(OH_AVPlayer *player);

/**
 * @brief 设置循环播放。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param loop 循环播放开关。
 * @return AV_ERR_OK：成功设置循环播放。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player SetLooping执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetLooping(OH_AVPlayer *player, bool loop);

/**
 * @brief 设置播放器回调函数。\n
 * 
 * 由于通过此方法设置的信息监听回调函数{@link OH_AVPlayerOnInfo}和错误监听回调函数{@link OH_AVPlayerOnError}可以传递的信息有限，
 * 也不便于应用区分多个播放器实例。\n
 * 从API 12开始，应使用{@link OH_AVPlayer_SetOnInfoCallback}、{@link OH_AVPlayer_SetOnErrorCallback}接口
 * 分别设置信息监听回调函数{@link OH_AVPlayerOnInfoCallback}和错误监听回调函数{@link OH_AVPlayerOnErrorCallback}。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param callback 回调对象指针。
 * @return AV_ERR_OK：成功设置播放器回调。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，callback.onInfo或onError为空，或者player SetPlayerCallback执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetPlayerCallback(OH_AVPlayer *player, AVPlayerCallback callback);

/**
 * @brief 选择音频或字幕轨道。\n
 *
 * 默认播放第一个带数据的音轨，不播放字幕轨迹。\n
 * 设置生效后，原音轨将失效。请设置字幕
 * 处于准备/播放/暂停/完成状态，并将音轨设置为准备状态。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param index 索引。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player SelectTrack执行失败。
 * @since 11
 * @version 1.0
*/
OH_AVErrCode OH_AVPlayer_SelectTrack(OH_AVPlayer *player, int32_t index);

/**
 * @brief 取消选择当前音频或字幕轨道。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param index 索引。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player DeselectTrack执行失败。
 * @since 11
 * @version 1.0
*/
OH_AVErrCode OH_AVPlayer_DeselectTrack(OH_AVPlayer *player, int32_t index);

/**
 * @brief 获取当前有效的轨道索引。
 *
 * 请将状态设置为准备/正在播放/暂停/完成。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param trackType 媒体类型。0：音频，1：视频。
 * @param index 索引。
 * @return AV_ERR_OK：成功获取轨道索引。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，或者player GetCurrentTrack执行失败。
 * @since 11
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetCurrentTrack(OH_AVPlayer *player, int32_t trackType, int32_t *index);

/**
 * @brief 设置播放器媒体密钥系统信息回调的方法。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param callback 对象指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针，callback为空指针，player SetDrmSystemInfoCallback，
 * SetDrmSystemInfoCallback或SetDrmSystemInfoCallback执行失败。
 * @since 12
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_SetMediaKeySystemInfoCallback(OH_AVPlayer *player,
    Player_MediaKeySystemInfoCallback callback);

/**
 * @brief 获取媒体密钥系统信息以创建媒体密钥会话。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param mediaKeySystemInfo 媒体密钥系统信息。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针或者内存不足。
 * @since 12
 * @version 1.0
 */
OH_AVErrCode OH_AVPlayer_GetMediaKeySystemInfo(OH_AVPlayer *player, DRM_MediaKeySystemInfo *mediaKeySystemInfo);

/**
 * @brief 设置解密信息。
 *
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param mediaKeySession 具有解密功能的媒体密钥会话实例。
 * @param secureVideoPath 是否需要安全解码器。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_INVALID_VAL：输入player为空指针或者player SetDecryptionConfig执行失败。
 * @since 12
 * @version 1.0
*/
OH_AVErrCode OH_AVPlayer_SetDecryptionConfig(OH_AVPlayer *player, MediaKeySession *mediaKeySession,
    bool secureVideoPath);

/**
 * @brief 设置播放器消息回调监听函数。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param callback 执行回调监听函数的指针，空指针表示取消设置播放器消息回调监听。
 * @param userData 指向应用调用者设置的实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_NO_MEMORY：内存分配失败。\n
 *         AV_ERR_INVALID_VAL： 输入player为空指针或者函数执行失败。
 * @since 12
 */
OH_AVErrCode OH_AVPlayer_SetOnInfoCallback(OH_AVPlayer *player, OH_AVPlayerOnInfoCallback callback, void *userData);

/**
 * @brief 设置播放器错误回调监听函数。
 * @syscap SystemCapability.Multimedia.Media.AVPlayer
 * @param player 指向OH_AVPlayer实例的指针。
 * @param callback 执行回调监听函数的指针，空指针表示取消设置播放器错误回调监听。
 * @param userData 指向应用调用者设置的实例的指针。
 * @return AV_ERR_OK：执行成功。\n
 *         AV_ERR_NO_MEMORY：内存分配失败。\n
 *         AV_ERR_INVALID_VAL： 输入player为空指针或者函数执行失败。
 * @since 12
 */
OH_AVErrCode OH_AVPlayer_SetOnErrorCallback(OH_AVPlayer *player, OH_AVPlayerOnErrorCallback callback, void *userData);

#ifdef __cplusplus
}
#endif

#endif // MULTIMEDIA_PLAYER_FRAMEWORK_NATIVE_AVPLAYER_H
